{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Parameter tuning for the 2D no-overlap constraints\n",
    "\n",
    "Check the other notebooks for basic usage examples.\n",
    "\n",
    "This notebook is just a simple experiment on the parameters for the 2D no-overlap constraints.\n",
    "CP-SAT exposes some parameters to control the handling of the no-overlap constraints.\n",
    "This concrete example shows an instance were the default parameters take a long time to find a solution,\n",
    "but when changing the parameters, the solution is found within a second."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from ortools.sat.python import cp_model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Instance\n",
    "container = (40, 15)\n",
    "boxes = [\n",
    "    (11, 3),\n",
    "    (13, 3),\n",
    "    (9, 2),\n",
    "    (7, 2),\n",
    "    (9, 3),\n",
    "    (7, 3),\n",
    "    (11, 2),\n",
    "    (13, 2),\n",
    "    (11, 4),\n",
    "    (13, 4),\n",
    "    (3, 5),\n",
    "    (11, 2),\n",
    "    (2, 2),\n",
    "    (11, 3),\n",
    "    (2, 3),\n",
    "    (5, 4),\n",
    "    (6, 4),\n",
    "    (12, 2),\n",
    "    (1, 2),\n",
    "    (3, 5),\n",
    "    (13, 5),\n",
    "    (12, 4),\n",
    "    (1, 4),\n",
    "    (5, 2),\n",
    "    # (6,  2),  # add to make tight\n",
    "    # (6,3), # add to make infeasible\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def pack(container, boxes, scale: int, parameter_tuning: bool):\n",
    "    container = (container[0] * scale, container[1] * scale)\n",
    "    boxes = [(box[0] * scale, box[1] * scale) for box in boxes]\n",
    "    model = cp_model.CpModel()\n",
    "    # We have to create the variable for the bottom left corner of the boxes.\n",
    "    # We directly limit their range, such that the boxes are inside the container\n",
    "    x_vars = [\n",
    "        model.new_int_var(0, container[0] - box[0], name=f\"x1_{i}\")\n",
    "        for i, box in enumerate(boxes)\n",
    "    ]\n",
    "    y_vars = [\n",
    "        model.new_int_var(0, container[1] - box[1], name=f\"y1_{i}\")\n",
    "        for i, box in enumerate(boxes)\n",
    "    ]\n",
    "    # Interval variables are actually more like constraint containers, that are then passed to the no overlap constraint\n",
    "    # Note that we could also make size and end variables, but we don't need them here\n",
    "    x_interval_vars = [\n",
    "        model.new_interval_var(\n",
    "            start=x_vars[i], size=box[0], end=x_vars[i] + box[0], name=f\"x_interval_{i}\"\n",
    "        )\n",
    "        for i, box in enumerate(boxes)\n",
    "    ]\n",
    "    y_interval_vars = [\n",
    "        model.new_interval_var(\n",
    "            start=y_vars[i], size=box[1], end=y_vars[i] + box[1], name=f\"y_interval_{i}\"\n",
    "        )\n",
    "        for i, box in enumerate(boxes)\n",
    "    ]\n",
    "    # Enforce that no two rectangles overlap\n",
    "    model.add_no_overlap_2d(x_interval_vars, y_interval_vars)\n",
    "    # Solve!\n",
    "    solver = cp_model.CpSolver()\n",
    "    solver.parameters.log_search_progress = True\n",
    "    if parameter_tuning:\n",
    "        solver.parameters.use_energetic_reasoning_in_no_overlap_2d = True\n",
    "        solver.parameters.use_timetabling_in_no_overlap_2d = True\n",
    "        # solver.parameters.use_pairwise_reasoning_in_no_overlap_2d = True\n",
    "    solver.log_callback = print\n",
    "    status = solver.solve(model)\n",
    "    assert status == cp_model.OPTIMAL\n",
    "    # plot the solution\n",
    "    import matplotlib.pyplot as plt\n",
    "    import matplotlib.patches as patches\n",
    "\n",
    "    fig, ax = plt.subplots(1)\n",
    "    ax.set_xlim(0, container[0])\n",
    "    ax.set_ylim(0, container[1])\n",
    "    for i, box in enumerate(boxes):\n",
    "        ax.add_patch(\n",
    "            patches.Rectangle(\n",
    "                (solver.value(x_vars[i]), solver.value(y_vars[i])),\n",
    "                box[0],\n",
    "                box[1],\n",
    "                facecolor=\"blue\",\n",
    "                alpha=0.2,\n",
    "                edgecolor=\"b\",\n",
    "            )\n",
    "        )\n",
    "    # uniform axis\n",
    "    ax.set_aspect(\"equal\", adjustable=\"box\")\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "Starting CP-SAT solver v9.10.4067Starting CP-SAT solver v9.10.4067\n",
      "Parameters: log_search_progress: true use_timetabling_in_no_overlap_2d: true use_energetic_reasoning_in_no_overlap_2d: true\n",
      "Setting number of workers to 8\n",
      "\n",
      "Parameters: log_search_progress: true use_timetabling_in_no_overlap_2d: true use_energetic_reasoning_in_no_overlap_2d: true\n",
      "Setting number of workers to 8\n",
      "\n",
      "\n",
      "Initial satisfaction model '': (model_fingerprint: 0x413a5366acad63cb)\n",
      "#Variables: 48\n",
      "  - 3 in [0,10000]\n",
      "  - 6 in [0,11000]\n",
      "  - 6 in [0,12000]\n",
      "  - 9 in [0,13000]\n",
      "  - 4 in [0,27000]\n",
      "  - 2 in [0,28000]\n",
      "  - 5 in [0,29000]\n",
      "  - 2 in [0,31000]\n",
      "  - 2 in [0,33000]\n",
      "  - 1 in [0,34000]\n",
      "  - 2 in [0,35000]\n",
      "  - 2 in [0,37000]\n",
      "  - 2 in [0,38000]\n",
      "  - 2 in [0,39000]\n",
      "#kInterval: 48\n",
      "#kNoOverlap2D: 1 (#rectangles: 24)\n",
      "\n",
      "Starting presolve at 0.00s\n",
      "  1.90e-05s  0.00e+00d  [DetectDominanceRelations] \n",
      "  1.40e-04s  0.00e+00d  [PresolveToFixPoint] #num_loops=2 #num_dual_strengthening=1 \n",
      "  3.00e-06s  0.00e+00d  [ExtractEncodingFromLinear] \n",
      "[Symmetry] Graph for symmetry has 193 nodes and 288 arcs.\n",
      "[Symmetry] Symmetry computation done. time: 0.000572 dtime: 5.681e-05\n",
      "[Symmetry] #generators: 3, average support size: 4\n",
      "[Symmetry] 6 orbits with sizes: 2,2,2,2,2,2\n",
      "[Symmetry] Found orbitope of size 2 x 2\n",
      "Initial satisfaction model '': (model_fingerprint: 0x413a5366acad63cb)\n",
      "#Variables: 48\n",
      "  - 3 in [0,10000]\n",
      "  - 6 in [0,11000]\n",
      "  - 6 in [0,12000]\n",
      "  - 9 in [0,13000]\n",
      "  - 4 in [0,27000]\n",
      "  - 2 in [0,28000]\n",
      "  - 5 in [0,29000]\n",
      "  - 2 in [0,31000]\n",
      "  - 2 in [0,33000]\n",
      "  - 1 in [0,34000]\n",
      "  - 2 in [0,35000]\n",
      "  - 2 in [0,37000]\n",
      "  - 2 in [0,38000]\n",
      "  - 2 in [0,39000]\n",
      "#kInterval: 48\n",
      "#kNoOverlap2D: 1 (#rectangles: 24)\n",
      "\n",
      "Starting presolve at 0.00s\n",
      "  1.90e-05s  0.00e+00d  [DetectDominanceRelations] \n",
      "  1.40e-04s  0.00e+00d  [PresolveToFixPoint] #num_loops=2 #num_dual_strengthening=1 \n",
      "  3.00e-06s  0.00e+00d  [ExtractEncodingFromLinear] \n",
      "[Symmetry] Graph for symmetry has 193 nodes and 288 arcs.\n",
      "[Symmetry] Symmetry computation done. time: 0.000572 dtime: 5.681e-05\n",
      "[Symmetry] #generators: 3, average support size: 4\n",
      "[Symmetry] 6 orbits with sizes: 2,2,2,2,2,2\n",
      "[Symmetry] Found orbitope of size 2 x 2\n",
      "  4.68e-03s  6.23e-06d  [Probe] \n",
      "  6.00e-06s  0.00e+00d  [MaxClique] \n",
      "  4.68e-03s  6.23e-06d  [Probe] \n",
      "  6.00e-06s  0.00e+00d  [MaxClique] \n",
      "  1.50e-05s  0.00e+00d  [DetectDominanceRelations] \n",
      "  2.77e-04s  0.00e+00d  [PresolveToFixPoint] #num_loops=2 #num_dual_strengthening=1 \n",
      "  3.00e-06s  0.00e+00d  [ProcessAtMostOneAndLinear] \n",
      "  2.80e-05s  0.00e+00d  [DetectDuplicateConstraints] \n",
      "  1.00e-06s  0.00e+00d  [DetectDominatedLinearConstraints] \n",
      "  1.00e-06s  0.00e+00d  [DetectDifferentVariables] \n",
      "  1.00e-06s  0.00e+00d  [ProcessSetPPC] \n",
      "  4.00e-06s  0.00e+00d  [FindAlmostIdenticalLinearConstraints] \n",
      "  2.00e-06s  0.00e+00d  [FindBigAtMostOneAndLinearOverlap] \n",
      "  1.00e-06s  2.40e-07d  [FindBigVerticalLinearOverlap] \n",
      "  1.00e-06s  0.00e+00d  [FindBigHorizontalLinearOverlap] \n",
      "  2.00e-06s  0.00e+00d  [MergeClauses] \n",
      "  1.50e-05s  0.00e+00d  [DetectDominanceRelations] \n",
      "  2.77e-04s  0.00e+00d  [PresolveToFixPoint] #num_loops=2 #num_dual_strengthening=1 \n",
      "  3.00e-06s  0.00e+00d  [ProcessAtMostOneAndLinear] \n",
      "  2.80e-05s  0.00e+00d  [DetectDuplicateConstraints] \n",
      "  1.00e-06s  0.00e+00d  [DetectDominatedLinearConstraints] \n",
      "  1.00e-06s  0.00e+00d  [DetectDifferentVariables] \n",
      "  1.00e-06s  0.00e+00d  [ProcessSetPPC] \n",
      "  4.00e-06s  0.00e+00d  [FindAlmostIdenticalLinearConstraints] \n",
      "  2.00e-06s  0.00e+00d  [FindBigAtMostOneAndLinearOverlap] \n",
      "  1.00e-06s  2.40e-07d  [FindBigVerticalLinearOverlap] \n",
      "  1.00e-06s  0.00e+00d  [FindBigHorizontalLinearOverlap] \n",
      "  2.00e-06s  0.00e+00d  [MergeClauses] \n",
      "  1.30e-05s  0.00e+00d  [DetectDominanceRelations] \n",
      "  8.00e-05s  0.00e+00d  [PresolveToFixPoint] #num_loops=1 #num_dual_strengthening=1 \n",
      "  1.30e-05s  0.00e+00d  [DetectDominanceRelations] \n",
      "  8.00e-05s  0.00e+00d  [PresolveToFixPoint] #num_loops=1 #num_dual_strengthening=1 \n",
      "\n",
      "Presolve summary:\n",
      "  - 0 affine relations were detected.\n",
      "  - rule 'TODO dual: only one blocking constraint?' was applied 288 times.\n",
      "  - rule 'TODO symmetry: add symmetry breaking inequalities?' was applied 1 time.\n",
      "  - rule 'presolve: 0 unused variables removed.' was applied 1 time.\n",
      "  - rule 'presolve: iteration' was applied 1 time.\n",
      "\n",
      "\n",
      "Presolve summary:\n",
      "  - 0 affine relations were detected.\n",
      "  - rule 'TODO dual: only one blocking constraint?' was applied 288 times.\n",
      "  - rule 'TODO symmetry: add symmetry breaking inequalities?' was applied 1 time.\n",
      "  - rule 'presolve: 0 unused variables removed.' was applied 1 time.\n",
      "  - rule 'presolve: iteration' was applied 1 time.\n",
      "\n",
      "Presolved satisfaction model '': (model_fingerprint: 0x413a5366acad63cb)\n",
      "#Variables: 48\n",
      "  - 3 in [0,10000]\n",
      "  - 6 in [0,11000]\n",
      "  - 6 in [0,12000]\n",
      "  - 9 in [0,13000]\n",
      "  - 4 in [0,27000]\n",
      "  - 2 in [0,28000]\n",
      "  - 5 in [0,29000]\n",
      "  - 2 in [0,31000]\n",
      "  - 2 in [0,33000]\n",
      "  - 1 in [0,34000]\n",
      "  - 2 in [0,35000]\n",
      "  - 2 in [0,37000]\n",
      "  - 2 in [0,38000]\n",
      "  - 2 in [0,39000]\n",
      "#kInterval: 48\n",
      "#kNoOverlap2D: 1 (#rectangles: 24)\n",
      "\n",
      "Preloading model.\n",
      "[Symmetry] Graph for symmetry has 193 nodes and 288 arcs.\n",
      "Presolved satisfaction model '': (model_fingerprint: 0x413a5366acad63cb)\n",
      "#Variables: 48\n",
      "  - 3 in [0,10000]\n",
      "  - 6 in [0,11000]\n",
      "  - 6 in [0,12000]\n",
      "  - 9 in [0,13000]\n",
      "  - 4 in [0,27000]\n",
      "  - 2 in [0,28000]\n",
      "  - 5 in [0,29000]\n",
      "  - 2 in [0,31000]\n",
      "  - 2 in [0,33000]\n",
      "  - 1 in [0,34000]\n",
      "  - 2 in [0,35000]\n",
      "  - 2 in [0,37000]\n",
      "  - 2 in [0,38000]\n",
      "  - 2 in [0,39000]\n",
      "#kInterval: 48\n",
      "#kNoOverlap2D: 1 (#rectangles: 24)\n",
      "\n",
      "Preloading model.\n",
      "[Symmetry] Graph for symmetry has 193 nodes and 288 arcs.\n",
      "[Symmetry] Symmetry computation done. time: 8e-05 dtime: 5.681e-05\n",
      "[Symmetry] #generators: 3, average support size: 4\n",
      "[Symmetry] Found orbitope of size 2 x 2\n",
      "#Model   0.01s var:48/48 constraints:49/49\n",
      "\n",
      "Starting search at 0.01s with 8 workers.\n",
      "6 full problem subsolvers: [default_lp, max_lp, no_lp, probing, quick_restart, quick_restart_no_lp]\n",
      "1 first solution subsolver: [fj_short_default]\n",
      "2 incomplete subsolvers: [feasibility_pump, rins/rens]\n",
      "2 helper subsolvers: [neighborhood_helper, synchronization_agent]\n",
      "[Symmetry] Symmetry computation done. time: 8e-05 dtime: 5.681e-05\n",
      "[Symmetry] #generators: 3, average support size: 4\n",
      "[Symmetry] Found orbitope of size 2 x 2\n",
      "#Model   0.01s var:48/48 constraints:49/49\n",
      "\n",
      "Starting search at 0.01s with 8 workers.\n",
      "6 full problem subsolvers: [default_lp, max_lp, no_lp, probing, quick_restart, quick_restart_no_lp]\n",
      "1 first solution subsolver: [fj_short_default]\n",
      "2 incomplete subsolvers: [feasibility_pump, rins/rens]\n",
      "2 helper subsolvers: [neighborhood_helper, synchronization_agent]\n",
      "#1       0.34s quick_restart_no_lp (fixed_bools=0/1333)#1       0.34s quick_restart_no_lp (fixed_bools=0/1333)\n",
      "\n",
      "\n",
      "\n",
      "Task timing                      n [     min,      max]      avg      dev     time         n [     min,      max]      avg      dev    dtime\n",
      "           'default_lp':         1 [328.94ms, 328.94ms] 328.94ms   0.00ns 328.94ms         1 [ 81.14ms,  81.14ms]  81.14ms   0.00ns  81.14ms\n",
      "     'feasibility_pump':         1 [ 20.59ms,  20.59ms]  20.59ms   0.00ns  20.59ms         0 [  0.00ns,   0.00ns]   0.00ns   0.00ns   0.00ns\n",
      "     'fj_short_default':         2 [ 90.57ms, 119.17ms] 104.87ms  14.30ms 209.75ms         0 [  0.00ns,   0.00ns]   0.00ns   0.00ns   0.00ns\n",
      "               'max_lp':         1 [329.25ms, 329.25ms] 329.25ms   0.00ns 329.25ms         1 [ 24.36ms,  24.36ms]  24.36ms   0.00ns  24.36ms\n",
      "                'no_lp':         1 [326.99ms, 326.99ms] 326.99ms   0.00ns 326.99ms         1 [ 85.11ms,  85.11ms]  85.11ms   0.00ns  85.11ms\n",
      "              'probing':         1 [328.36ms, 328.36ms] 328.36ms   0.00ns 328.36ms         1 [  1.07ms,   1.07ms]   1.07ms   0.00ns   1.07ms\n",
      "        'quick_restart':         1 [325.74ms, 325.74ms] 325.74ms   0.00ns 325.74ms         1 [ 54.30ms,  54.30ms]  54.30ms   0.00ns  54.30ms\n",
      "  'quick_restart_no_lp':         1 [325.15ms, 325.15ms] 325.15ms   0.00ns 325.15ms         1 [ 41.37ms,  41.37ms]  41.37ms   0.00ns  41.37ms\n",
      "            'rins/rens':         3 [  1.22ms, 295.53ms] 137.65ms 121.11ms 412.95ms         2 [132.00ns,  50.26ms]  25.13ms  25.13ms  50.26ms\n",
      "\n",
      "Task timing                      n [     min,      max]      avg      dev     time         n [     min,      max]      avg      dev    dtime\n",
      "           'default_lp':         1 [328.94ms, 328.94ms] 328.94ms   0.00ns 328.94ms         1 [ 81.14ms,  81.14ms]  81.14ms   0.00ns  81.14ms\n",
      "     'feasibility_pump':         1 [ 20.59ms,  20.59ms]  20.59ms   0.00ns  20.59ms         0 [  0.00ns,   0.00ns]   0.00ns   0.00ns   0.00ns\n",
      "     'fj_short_default':         2 [ 90.57ms, 119.17ms] 104.87ms  14.30ms 209.75ms         0 [  0.00ns,   0.00ns]   0.00ns   0.00ns   0.00ns\n",
      "               'max_lp':         1 [329.25ms, 329.25ms] 329.25ms   0.00ns 329.25ms         1 [ 24.36ms,  24.36ms]  24.36ms   0.00ns  24.36ms\n",
      "                'no_lp':         1 [326.99ms, 326.99ms] 326.99ms   0.00ns 326.99ms         1 [ 85.11ms,  85.11ms]  85.11ms   0.00ns  85.11ms\n",
      "              'probing':         1 [328.36ms, 328.36ms] 328.36ms   0.00ns 328.36ms         1 [  1.07ms,   1.07ms]   1.07ms   0.00ns   1.07ms\n",
      "        'quick_restart':         1 [325.74ms, 325.74ms] 325.74ms   0.00ns 325.74ms         1 [ 54.30ms,  54.30ms]  54.30ms   0.00ns  54.30ms\n",
      "  'quick_restart_no_lp':         1 [325.15ms, 325.15ms] 325.15ms   0.00ns 325.15ms         1 [ 41.37ms,  41.37ms]  41.37ms   0.00ns  41.37ms\n",
      "            'rins/rens':         3 [  1.22ms, 295.53ms] 137.65ms 121.11ms 412.95ms         2 [132.00ns,  50.26ms]  25.13ms  25.13ms  50.26ms\n",
      "\n",
      "Search stats              Bools  Conflicts  Branches  Restarts  BoolPropag  IntegerPropag\n",
      "           'default_lp':  4'414      4'401    32'111       174     122'356         97'433\n",
      "               'max_lp':  7'076      7'052     7'828        43      10'112         71'646\n",
      "                'no_lp':  4'481      4'468    33'005       175     131'273         99'745\n",
      "              'probing':    167         92     2'208       366       1'103          4'699\n",
      "        'quick_restart':    807      2'744    30'233       506     213'894         71'437\n",
      "  'quick_restart_no_lp':  1'333      1'921    31'537       400     183'633         62'705\n",
      "\n",
      "Search stats              Bools  Conflicts  Branches  Restarts  BoolPropag  IntegerPropag\n",
      "           'default_lp':  4'414      4'401    32'111       174     122'356         97'433\n",
      "               'max_lp':  7'076      7'052     7'828        43      10'112         71'646\n",
      "                'no_lp':  4'481      4'468    33'005       175     131'273         99'745\n",
      "              'probing':    167         92     2'208       366       1'103          4'699\n",
      "        'quick_restart':    807      2'744    30'233       506     213'894         71'437\n",
      "  'quick_restart_no_lp':  1'333      1'921    31'537       400     183'633         62'705\n",
      "\n",
      "SAT stats                 ClassicMinim  LitRemoved  LitLearned  LitForgotten  Subsumed  MClauses  MDecisions  MLitTrue  MSubsumed  MLitRemoved  MReused\n",
      "           'default_lp':         4'351       4'651      55'313             0         0         0           0         0          0            0        0\n",
      "               'max_lp':             1           1      91'827             0         1         0           0         0          0            0        0\n",
      "                'no_lp':         4'418       4'718      56'251             0         0         0           0         0          0            0        0\n",
      "              'probing':            15          19       2'089             0         0         0           0         0          0            0        0\n",
      "        'quick_restart':           515         797      50'966             0        35         2          13         0          0            0        3\n",
      "  'quick_restart_no_lp':           298         451      34'535             0        28         0           0         0          0            0        0\n",
      "\n",
      "SAT stats                 ClassicMinim  LitRemoved  LitLearned  LitForgotten  Subsumed  MClauses  MDecisions  MLitTrue  MSubsumed  MLitRemoved  MReused\n",
      "           'default_lp':         4'351       4'651      55'313             0         0         0           0         0          0            0        0\n",
      "               'max_lp':             1           1      91'827             0         1         0           0         0          0            0        0\n",
      "                'no_lp':         4'418       4'718      56'251             0         0         0           0         0          0            0        0\n",
      "              'probing':            15          19       2'089             0         0         0           0         0          0            0        0\n",
      "        'quick_restart':           515         797      50'966             0        35         2          13         0          0            0        3\n",
      "  'quick_restart_no_lp':           298         451      34'535             0        28         0           0         0          0            0        0\n",
      "\n",
      "Lp stats     Component  Iterations  AddedCuts  OPTIMAL  DUAL_F.  DUAL_U.\n",
      "  'max_lp':          1          51         18    7'075        0        0\n",
      "\n",
      "Lp stats     Component  Iterations  AddedCuts  OPTIMAL  DUAL_F.  DUAL_U.\n",
      "  'max_lp':          1          51         18    7'075        0        0\n",
      "\n",
      "Lp dimension                                               Final dimension of first component\n",
      "     'max_lp':  5 rows, 48 columns, 90 entries with magnitude in [5.946036e-01, 1.000000e+00]\n",
      "\n",
      "Lp dimension                                               Final dimension of first component\n",
      "     'max_lp':  5 rows, 48 columns, 90 entries with magnitude in [5.946036e-01, 1.000000e+00]\n",
      "\n",
      "Lp debug     CutPropag  CutEqPropag  Adjust  Overflow  Bad  BadScaling\n",
      "  'max_lp':          0            0       0         0   30           0\n",
      "\n",
      "Lp debug     CutPropag  CutEqPropag  Adjust  Overflow  Bad  BadScaling\n",
      "  'max_lp':          0            0       0         0   30           0\n",
      "\n",
      "Lp pool      Constraints  Updates  Simplif  Merged  Shortened  Split  Strenghtened  Cuts/Call\n",
      "  'max_lp':           18        0        0       0          0      0             0      18/20\n",
      "\n",
      "Lp pool      Constraints  Updates  Simplif  Merged  Shortened  Split  Strenghtened  Cuts/Call\n",
      "  'max_lp':           18        0        0       0          0      0             0      18/20\n",
      "\n",
      "Lp Cut                         max_lp\n",
      "                        CG_R:       2\n",
      "                     MIR_1_R:       5\n",
      "  NoOverlap2dXCompletionTime:       5\n",
      "  NoOverlap2dYCompletionTime:       5\n",
      "                 ZERO_HALF_R:       1\n",
      "\n",
      "Lp Cut                         max_lp\n",
      "                        CG_R:       2\n",
      "                     MIR_1_R:       5\n",
      "  NoOverlap2dXCompletionTime:       5\n",
      "  NoOverlap2dYCompletionTime:       5\n",
      "                 ZERO_HALF_R:       1\n",
      "\n",
      "LNS stats       Improv/Calls  Closed  Difficulty  TimeLimit\n",
      "  'rins/rens':           3/3     33%        0.36       0.10\n",
      "\n",
      "LNS stats       Improv/Calls  Closed  Difficulty  TimeLimit\n",
      "  'rins/rens':           3/3     33%        0.36       0.10\n",
      "\n",
      "LS stats               Batches  Restarts  LinMoves  GenMoves  CompoundMoves  WeightUpdates\n",
      "  'fj_short_default':        2         1         0       794            126              0\n",
      "\n",
      "LS stats               Batches  Restarts  LinMoves  GenMoves  CompoundMoves  WeightUpdates\n",
      "  'fj_short_default':        2         1         0       794            126              0\n",
      "\n",
      "Solution repositories    Added  Queried  Ignored  Synchro\n",
      "  'feasible solutions':      1        0        0        1\n",
      "        'lp solutions':     34        3       37        5\n",
      "                'pump':      0        0\n",
      "\n",
      "Solution repositories    Added  Queried  Ignored  Synchro\n",
      "  'feasible solutions':      1        0        0        1\n",
      "        'lp solutions':     34        3       37        5\n",
      "                'pump':      0        0\n",
      "\n",
      "CpSolverResponse summary:\n",
      "status: OPTIMAL\n",
      "objective: NA\n",
      "best_bound: NA\n",
      "integers: 54\n",
      "booleans: 4414\n",
      "conflicts: 4401\n",
      "branches: 32111\n",
      "propagations: 122356\n",
      "integer_propagations: 97433\n",
      "restarts: 174\n",
      "lp_iterations: 0\n",
      "walltime: 0.345209\n",
      "usertime: 0.345209\n",
      "deterministic_time: 0.337611\n",
      "gap_integral: 0\n",
      "solution_fingerprint: 0xd19db2b9bc16a1f5\n",
      "\n",
      "CpSolverResponse summary:\n",
      "status: OPTIMAL\n",
      "objective: NA\n",
      "best_bound: NA\n",
      "integers: 54\n",
      "booleans: 4414\n",
      "conflicts: 4401\n",
      "branches: 32111\n",
      "propagations: 122356\n",
      "integer_propagations: 97433\n",
      "restarts: 174\n",
      "lp_iterations: 0\n",
      "walltime: 0.345209\n",
      "usertime: 0.345209\n",
      "deterministic_time: 0.337611\n",
      "gap_integral: 0\n",
      "solution_fingerprint: 0xd19db2b9bc16a1f5\n",
      "\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "pack(container, boxes, 1000, True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Starting CP-SAT solver v9.10.4067\n",
      "\n",
      "Parameters: log_search_progress: true\n",
      "Starting CP-SAT solver v9.10.4067\n",
      "Parameters: log_search_progress: true\n",
      "Setting number of workers to 8\n",
      "Setting number of workers to 8\n",
      "\n",
      "\n",
      "Initial satisfaction model '': (model_fingerprint: 0x413a5366acad63cb)\n",
      "#Variables: 48\n",
      "  - 3 in [0,10000]\n",
      "  - 6 in [0,11000]\n",
      "  - 6 in [0,12000]\n",
      "  - 9 in [0,13000]\n",
      "  - 4 in [0,27000]\n",
      "  - 2 in [0,28000]\n",
      "  - 5 in [0,29000]\n",
      "  - 2 in [0,31000]\n",
      "  - 2 in [0,33000]\n",
      "  - 1 in [0,34000]\n",
      "  - 2 in [0,35000]\n",
      "  - 2 in [0,37000]\n",
      "  - 2 in [0,38000]\n",
      "  - 2 in [0,39000]\n",
      "#kInterval: 48\n",
      "#kNoOverlap2D: 1 (#rectangles: 24)\n",
      "Initial satisfaction model '': (model_fingerprint: 0x413a5366acad63cb)\n",
      "#Variables: 48\n",
      "  - 3 in [0,10000]\n",
      "  - 6 in [0,11000]\n",
      "  - 6 in [0,12000]\n",
      "  - 9 in [0,13000]\n",
      "  - 4 in [0,27000]\n",
      "  - 2 in [0,28000]\n",
      "  - 5 in [0,29000]\n",
      "  - 2 in [0,31000]\n",
      "  - 2 in [0,33000]\n",
      "  - 1 in [0,34000]\n",
      "  - 2 in [0,35000]\n",
      "  - 2 in [0,37000]\n",
      "  - 2 in [0,38000]\n",
      "  - 2 in [0,39000]\n",
      "#kInterval: 48\n",
      "#kNoOverlap2D: 1 (#rectangles: 24)\n",
      "\n",
      "Starting presolve at 0.00s\n",
      "\n",
      "Starting presolve at 0.00s\n",
      "  1.10e-05s  0.00e+00d  [DetectDominanceRelations] \n",
      "  1.10e-05s  0.00e+00d  [DetectDominanceRelations] \n",
      "  4.31e-04s  0.00e+00d  [PresolveToFixPoint] #num_loops=2 #num_dual_strengthening=1 \n",
      "  4.31e-04s  0.00e+00d  [PresolveToFixPoint] #num_loops=2 #num_dual_strengthening=1 \n",
      "  1.00e-06s  0.00e+00d  [ExtractEncodingFromLinear] \n",
      "  1.00e-06s  0.00e+00d  [ExtractEncodingFromLinear] \n",
      "[Symmetry] Graph for symmetry has 193 nodes and 288 arcs.\n",
      "[Symmetry] Graph for symmetry has 193 nodes and 288 arcs.\n",
      "[Symmetry] Symmetry computation done. time: 5.3e-05 dtime: 5.681e-05\n",
      "[Symmetry] #generators: 3, average support size: 4\n",
      "[Symmetry] Symmetry computation done. time: 5.3e-05 dtime: 5.681e-05\n",
      "[Symmetry] #generators: 3, average support size: 4\n",
      "[Symmetry] 6 orbits with sizes: 2,2,2,2,2,2\n",
      "[Symmetry] Found orbitope of size 2 x 2\n",
      "[Symmetry] 6 orbits with sizes: 2,2,2,2,2,2\n",
      "[Symmetry] Found orbitope of size 2 x 2\n",
      "  8.40e-05s  5.00e-08d  [Probe] \n",
      "  8.40e-05s  5.00e-08d  [Probe] \n",
      "  1.00e-06s  0.00e+00d  [MaxClique] \n",
      "  1.00e-06s  0.00e+00d  [MaxClique] \n",
      "  6.00e-06s  0.00e+00d  [DetectDominanceRelations] \n",
      "  6.00e-06s  0.00e+00d  [DetectDominanceRelations] \n",
      "  5.20e-05s  0.00e+00d  [PresolveToFixPoint] #num_loops=2 #num_dual_strengthening=1 \n",
      "  1.00e-06s  0.00e+00d  [ProcessAtMostOneAndLinear] \n",
      "  4.00e-06s  0.00e+00d  [DetectDuplicateConstraints] \n",
      "  5.20e-05s  0.00e+00d  [PresolveToFixPoint] #num_loops=2 #num_dual_strengthening=1 \n",
      "  1.00e-06s  0.00e+00d  [ProcessAtMostOneAndLinear] \n",
      "  0.00e+00s  0.00e+00d  [DetectDominatedLinearConstraints] \n",
      "  0.00e+00s  0.00e+00d  [DetectDifferentVariables] \n",
      "  4.00e-06s  0.00e+00d  [DetectDuplicateConstraints] \n",
      "  0.00e+00s  0.00e+00d  [DetectDominatedLinearConstraints] \n",
      "  0.00e+00s  0.00e+00d  [DetectDifferentVariables] \n",
      "  1.00e-06s  0.00e+00d  [ProcessSetPPC] \n",
      "  1.00e-06s  0.00e+00d  [ProcessSetPPC] \n",
      "  0.00e+00s  0.00e+00d  [FindAlmostIdenticalLinearConstraints] \n",
      "  1.00e-06s  0.00e+00d  [FindBigAtMostOneAndLinearOverlap] \n",
      "  0.00e+00s  0.00e+00d  [FindAlmostIdenticalLinearConstraints] \n",
      "  1.00e-06s  0.00e+00d  [FindBigAtMostOneAndLinearOverlap] \n",
      "  0.00e+00s  2.40e-07d  [FindBigVerticalLinearOverlap] \n",
      "  0.00e+00s  2.40e-07d  [FindBigVerticalLinearOverlap] \n",
      "  0.00e+00s  0.00e+00d  [FindBigHorizontalLinearOverlap] \n",
      "  0.00e+00s  0.00e+00d  [MergeClauses] \n",
      "  0.00e+00s  0.00e+00d  [FindBigHorizontalLinearOverlap] \n",
      "  0.00e+00s  0.00e+00d  [MergeClauses] \n",
      "  5.00e-06s  0.00e+00d  [DetectDominanceRelations] \n",
      "  4.10e-05s  0.00e+00d  [PresolveToFixPoint] #num_loops=1 #num_dual_strengthening=1 \n",
      "  5.00e-06s  0.00e+00d  [DetectDominanceRelations] \n",
      "  4.10e-05s  0.00e+00d  [PresolveToFixPoint] #num_loops=1 #num_dual_strengthening=1 \n",
      "\n",
      "Presolve summary:\n",
      "  - 0 affine relations were detected.\n",
      "  - rule 'TODO dual: only one blocking constraint?' was applied 288 times.\n",
      "  - rule 'TODO symmetry: add symmetry breaking inequalities?' was applied 1 time.\n",
      "  - rule 'presolve: 0 unused variables removed.' was applied 1 time.\n",
      "  - rule 'presolve: iteration' was applied 1 time.\n",
      "\n",
      "Presolve summary:\n",
      "  - 0 affine relations were detected.\n",
      "  - rule 'TODO dual: only one blocking constraint?' was applied 288 times.\n",
      "  - rule 'TODO symmetry: add symmetry breaking inequalities?' was applied 1 time.\n",
      "  - rule 'presolve: 0 unused variables removed.' was applied 1 time.\n",
      "  - rule 'presolve: iteration' was applied 1 time.\n",
      "\n",
      "\n",
      "Presolved satisfaction model '': (model_fingerprint: 0x413a5366acad63cb)\n",
      "#Variables: 48\n",
      "  - 3 in [0,10000]\n",
      "  - 6 in [0,11000]\n",
      "  - 6 in [0,12000]\n",
      "  - 9 in [0,13000]\n",
      "  - 4 in [0,27000]\n",
      "  - 2 in [0,28000]\n",
      "  - 5 in [0,29000]\n",
      "  - 2 in [0,31000]\n",
      "  - 2 in [0,33000]\n",
      "  - 1 in [0,34000]\n",
      "  - 2 in [0,35000]\n",
      "  - 2 in [0,37000]\n",
      "  - 2 in [0,38000]\n",
      "  - 2 in [0,39000]\n",
      "#kInterval: 48\n",
      "#kNoOverlap2D: 1 (#rectangles: 24)\n",
      "Presolved satisfaction model '': (model_fingerprint: 0x413a5366acad63cb)\n",
      "#Variables: 48\n",
      "  - 3 in [0,10000]\n",
      "  - 6 in [0,11000]\n",
      "  - 6 in [0,12000]\n",
      "  - 9 in [0,13000]\n",
      "  - 4 in [0,27000]\n",
      "  - 2 in [0,28000]\n",
      "  - 5 in [0,29000]\n",
      "  - 2 in [0,31000]\n",
      "  - 2 in [0,33000]\n",
      "  - 1 in [0,34000]\n",
      "  - 2 in [0,35000]\n",
      "  - 2 in [0,37000]\n",
      "  - 2 in [0,38000]\n",
      "  - 2 in [0,39000]\n",
      "#kInterval: 48\n",
      "#kNoOverlap2D: 1 (#rectangles: 24)\n",
      "\n",
      "Preloading model.\n",
      "\n",
      "Preloading model.\n",
      "[Symmetry] Graph for symmetry has 193 nodes and 288 arcs.\n",
      "[Symmetry] Graph for symmetry has 193 nodes and 288 arcs.\n",
      "[Symmetry] Symmetry computation done. time: 0.000113 dtime: 5.681e-05\n",
      "[Symmetry] #generators: 3, average support size: 4\n",
      "[Symmetry] Symmetry computation done. time: 0.000113 dtime: 5.681e-05\n",
      "[Symmetry] #generators: 3, average support size: 4\n",
      "[Symmetry] Found orbitope of size 2 x 2\n",
      "[Symmetry] Found orbitope of size 2 x 2\n",
      "#Model   0.00s var:48/48 constraints:49/49\n",
      "#Model   0.00s var:48/48 constraints:49/49\n",
      "\n",
      "Starting search at 0.00s with 8 workers.\n",
      "\n",
      "Starting search at 0.00s with 8 workers.\n",
      "6 full problem subsolvers: [default_lp, max_lp, no_lp, probing, quick_restart, quick_restart_no_lp]\n",
      "6 full problem subsolvers: [default_lp, max_lp, no_lp, probing, quick_restart, quick_restart_no_lp]\n",
      "1 first solution subsolver: [fj_short_default]\n",
      "2 incomplete subsolvers: [feasibility_pump, rins/rens]\n",
      "2 helper subsolvers: [neighborhood_helper, synchronization_agent]\n",
      "1 first solution subsolver: [fj_short_default]\n",
      "2 incomplete subsolvers: [feasibility_pump, rins/rens]\n",
      "2 helper subsolvers: [neighborhood_helper, synchronization_agent]\n",
      "#1     462.52s fj_short_default(batch:735 #lin_moves:0 #lin_evals:0 #gen_moves:381'309 #gen_evals:2'919'864 #comp_moves:3'081 #backtracks:189'114 #weight_updates:453)#1     462.52s fj_short_default(batch:735 #lin_moves:0 #lin_evals:0 #gen_moves:381'309 #gen_evals:2'919'864 #comp_moves:3'081 #backtracks:189'114 #weight_updates:453)\n",
      "\n",
      "\n",
      "\n",
      "Task timing                      n [     min,      max]      avg      dev     time         n [     min,      max]      avg      dev    dtime\n",
      "           'default_lp':         1 [   7.71m,    7.71m]    7.71m   0.00ns    7.71m         1 [  11.49m,   11.49m]   11.49m   0.00ns   11.49m\n",
      "     'feasibility_pump':         1 [135.00us, 135.00us] 135.00us   0.00ns 135.00us         0 [  0.00ns,   0.00ns]   0.00ns   0.00ns   0.00ns\n",
      "     'fj_short_default':       735 [ 74.46ms, 267.78ms] 106.21ms  15.14ms    1.30m         0 [  0.00ns,   0.00ns]   0.00ns   0.00ns   0.00ns\n",
      "               'max_lp':         1 [   7.71m,    7.71m]    7.71m   0.00ns    7.71m         1 [  13.18m,   13.18m]   13.18m   0.00ns   13.18m\n",
      "                'no_lp':         1 [   7.71m,    7.71m]    7.71m   0.00ns    7.71m         1 [  10.79m,   10.79m]   10.79m   0.00ns   10.79m\n",
      "              'probing':         1 [   7.71m,    7.71m]    7.71m   0.00ns    7.71m         1 [  48.25s,   48.25s]   48.25s   0.00ns   48.25s\n",
      "        'quick_restart':         1 [   7.71m,    7.71m]    7.71m   0.00ns    7.71m         1 [   3.00m,    3.00m]    3.00m   0.00ns    3.00m\n",
      "  'quick_restart_no_lp':         1 [   7.71m,    7.71m]    7.71m   0.00ns    7.71m         1 [   3.17m,    3.17m]    3.17m   0.00ns    3.17m\n",
      "            'rins/rens':       735 [420.00us,   27.05s]    1.15s    2.60s   14.11m       734 [ 30.00ns, 200.49ms]  50.61ms  50.95ms   37.14s\n",
      "\n",
      "Task timing                      n [     min,      max]      avg      dev     time         n [     min,      max]      avg      dev    dtime\n",
      "           'default_lp':         1 [   7.71m,    7.71m]    7.71m   0.00ns    7.71m         1 [  11.49m,   11.49m]   11.49m   0.00ns   11.49m\n",
      "     'feasibility_pump':         1 [135.00us, 135.00us] 135.00us   0.00ns 135.00us         0 [  0.00ns,   0.00ns]   0.00ns   0.00ns   0.00ns\n",
      "     'fj_short_default':       735 [ 74.46ms, 267.78ms] 106.21ms  15.14ms    1.30m         0 [  0.00ns,   0.00ns]   0.00ns   0.00ns   0.00ns\n",
      "               'max_lp':         1 [   7.71m,    7.71m]    7.71m   0.00ns    7.71m         1 [  13.18m,   13.18m]   13.18m   0.00ns   13.18m\n",
      "                'no_lp':         1 [   7.71m,    7.71m]    7.71m   0.00ns    7.71m         1 [  10.79m,   10.79m]   10.79m   0.00ns   10.79m\n",
      "              'probing':         1 [   7.71m,    7.71m]    7.71m   0.00ns    7.71m         1 [  48.25s,   48.25s]   48.25s   0.00ns   48.25s\n",
      "        'quick_restart':         1 [   7.71m,    7.71m]    7.71m   0.00ns    7.71m         1 [   3.00m,    3.00m]    3.00m   0.00ns    3.00m\n",
      "  'quick_restart_no_lp':         1 [   7.71m,    7.71m]    7.71m   0.00ns    7.71m         1 [   3.17m,    3.17m]    3.17m   0.00ns    3.17m\n",
      "            'rins/rens':       735 [420.00us,   27.05s]    1.15s    2.60s   14.11m       734 [ 30.00ns, 200.49ms]  50.61ms  50.95ms   37.14s\n",
      "\n",
      "Search stats                Bools  Conflicts    Branches  Restarts     BoolPropag  IntegerPropag\n",
      "           'default_lp':  156'248    156'222  34'800'485    33'484  6'041'902'453    488'603'766\n",
      "               'max_lp':  107'776    618'998  22'641'077    18'003  6'994'855'454    604'612'349\n",
      "                'no_lp':  153'350    153'324  32'179'470    31'597  5'616'911'436    476'352'264\n",
      "              'probing':   59'385     72'161   8'708'036   530'446    416'899'256      9'913'421\n",
      "        'quick_restart':  108'936    158'051  52'322'270    26'187  1'763'328'724     54'031'189\n",
      "  'quick_restart_no_lp':  114'180    164'982  51'213'516    27'646  1'870'963'925     53'022'938\n",
      "\n",
      "Search stats                Bools  Conflicts    Branches  Restarts     BoolPropag  IntegerPropag\n",
      "           'default_lp':  156'248    156'222  34'800'485    33'484  6'041'902'453    488'603'766\n",
      "               'max_lp':  107'776    618'998  22'641'077    18'003  6'994'855'454    604'612'349\n",
      "                'no_lp':  153'350    153'324  32'179'470    31'597  5'616'911'436    476'352'264\n",
      "              'probing':   59'385     72'161   8'708'036   530'446    416'899'256      9'913'421\n",
      "        'quick_restart':  108'936    158'051  52'322'270    26'187  1'763'328'724     54'031'189\n",
      "  'quick_restart_no_lp':  114'180    164'982  51'213'516    27'646  1'870'963'925     53'022'938\n",
      "\n",
      "SAT stats                 ClassicMinim  LitRemoved  LitLearned  LitForgotten  Subsumed  MClauses  MDecisions  MLitTrue  MSubsumed  MLitRemoved  MReused\n",
      "           'default_lp':        38'026      38'026   1'103'891       825'170         0    23'677     279'655         0         42          210   28'145\n",
      "               'max_lp':        66'706      66'706   3'687'667     2'964'898         0    12'032     142'186         0          3           15   14'211\n",
      "                'no_lp':        38'026      38'026   1'080'707       825'170         0    22'395     264'719         0          3           15   26'662\n",
      "              'probing':        15'714      26'903   1'847'927     1'517'780       531        60         780         0          0            0       24\n",
      "        'quick_restart':         1'603       2'472   1'083'224       857'478        26     6'403      67'833         0      1'410        7'038    5'232\n",
      "  'quick_restart_no_lp':         2'414       4'072   1'148'295       936'106        22     7'007      73'968         0      1'754        8'877    5'458\n",
      "\n",
      "SAT stats                 ClassicMinim  LitRemoved  LitLearned  LitForgotten  Subsumed  MClauses  MDecisions  MLitTrue  MSubsumed  MLitRemoved  MReused\n",
      "           'default_lp':        38'026      38'026   1'103'891       825'170         0    23'677     279'655         0         42          210   28'145\n",
      "               'max_lp':        66'706      66'706   3'687'667     2'964'898         0    12'032     142'186         0          3           15   14'211\n",
      "                'no_lp':        38'026      38'026   1'080'707       825'170         0    22'395     264'719         0          3           15   26'662\n",
      "              'probing':        15'714      26'903   1'847'927     1'517'780       531        60         780         0          0            0       24\n",
      "        'quick_restart':         1'603       2'472   1'083'224       857'478        26     6'403      67'833         0      1'410        7'038    5'232\n",
      "  'quick_restart_no_lp':         2'414       4'072   1'148'295       936'106        22     7'007      73'968         0      1'754        8'877    5'458\n",
      "\n",
      "Lp stats     Component  Iterations  AddedCuts    OPTIMAL  DUAL_F.  DUAL_U.\n",
      "  'max_lp':          1     364'663         18  2'390'221        0        0\n",
      "\n",
      "Lp stats     Component  Iterations  AddedCuts    OPTIMAL  DUAL_F.  DUAL_U.\n",
      "  'max_lp':          1     364'663         18  2'390'221        0        0\n",
      "\n",
      "Lp dimension                                                Final dimension of first component\n",
      "     'max_lp':  6 rows, 48 columns, 114 entries with magnitude in [5.946036e-01, 1.000000e+00]\n",
      "\n",
      "Lp dimension                                                Final dimension of first component\n",
      "     'max_lp':  6 rows, 48 columns, 114 entries with magnitude in [5.946036e-01, 1.000000e+00]\n",
      "\n",
      "Lp debug     CutPropag  CutEqPropag  Adjust  Overflow  Bad  BadScaling\n",
      "  'max_lp':          0            0       0         0   30           0\n",
      "\n",
      "Lp debug     CutPropag  CutEqPropag  Adjust  Overflow  Bad  BadScaling\n",
      "  'max_lp':          0            0       0         0   30           0\n",
      "\n",
      "Lp pool      Constraints  Updates  Simplif  Merged  Shortened  Split  Strenghtened  Cuts/Call\n",
      "  'max_lp':           18        0        0       0          0      0             0      18/20\n",
      "\n",
      "Lp pool      Constraints  Updates  Simplif  Merged  Shortened  Split  Strenghtened  Cuts/Call\n",
      "  'max_lp':           18        0        0       0          0      0             0      18/20\n",
      "\n",
      "Lp Cut                         max_lp\n",
      "                        CG_R:       2\n",
      "                     MIR_1_R:       5\n",
      "  NoOverlap2dXCompletionTime:       5\n",
      "  NoOverlap2dYCompletionTime:       5\n",
      "                 ZERO_HALF_R:       1\n",
      "\n",
      "Lp Cut                         max_lp\n",
      "                        CG_R:       2\n",
      "                     MIR_1_R:       5\n",
      "  NoOverlap2dXCompletionTime:       5\n",
      "  NoOverlap2dYCompletionTime:       5\n",
      "                 ZERO_HALF_R:       1\n",
      "\n",
      "LNS stats       Improv/Calls  Closed  Difficulty  TimeLimit\n",
      "  'rins/rens':       735/735     50%        0.75       0.10\n",
      "\n",
      "LNS stats       Improv/Calls  Closed  Difficulty  TimeLimit\n",
      "  'rins/rens':       735/735     50%        0.75       0.10\n",
      "\n",
      "LS stats               Batches  Restarts  LinMoves  GenMoves  CompoundMoves  WeightUpdates\n",
      "  'fj_short_default':      735         1         0   381'309          3'081            453\n",
      "\n",
      "LS stats               Batches  Restarts  LinMoves  GenMoves  CompoundMoves  WeightUpdates\n",
      "  'fj_short_default':      735         1         0   381'309          3'081            453\n",
      "\n",
      "Solution repositories     Added  Queried  Ignored  Synchro\n",
      "  'feasible solutions':       1        0        0        1\n",
      "        'lp solutions':  17'842      735   20'110    3'893\n",
      "                'pump':       0        0\n",
      "\n",
      "Solution repositories     Added  Queried  Ignored  Synchro\n",
      "  'feasible solutions':       1        0        0        1\n",
      "        'lp solutions':  17'842      735   20'110    3'893\n",
      "                'pump':       0        0\n",
      "\n",
      "CpSolverResponse summary:\n",
      "status: OPTIMAL\n",
      "objective: NA\n",
      "best_bound: NA\n",
      "integers: 48\n",
      "booleans: 156248\n",
      "conflicts: 156222\n",
      "branches: 34800485\n",
      "propagations: 6041902453\n",
      "integer_propagations: 488603766\n",
      "restarts: 33484\n",
      "lp_iterations: 0\n",
      "walltime: 462.62\n",
      "usertime: 462.62\n",
      "deterministic_time: 2582.96\n",
      "gap_integral: 0\n",
      "solution_fingerprint: 0x7db01b3f0e2335b0\n",
      "\n",
      "CpSolverResponse summary:\n",
      "status: OPTIMAL\n",
      "objective: NA\n",
      "best_bound: NA\n",
      "integers: 48\n",
      "booleans: 156248\n",
      "conflicts: 156222\n",
      "branches: 34800485\n",
      "propagations: 6041902453\n",
      "integer_propagations: 488603766\n",
      "restarts: 33484\n",
      "lp_iterations: 0\n",
      "walltime: 462.62\n",
      "usertime: 462.62\n",
      "deterministic_time: 2582.96\n",
      "gap_integral: 0\n",
      "solution_fingerprint: 0x7db01b3f0e2335b0\n",
      "\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "pack(container, boxes, 1000, False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "mo",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.3"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
